/*
 * UsuarioBean
 *
 * Creado el 24/04/2009, 11:41:16 AM
 */
package com.unicon.autoservicio.view.bean;

import com.unicon.autoservicio.bean.ObraBeanViewBean;

import com.unicon.autoservicio.dao.SeguridadDAO;
import com.unicon.autoservicio.util.FacesUtils;

import com.unicon.sdc.ds.ws.ObraBean;
import com.unicon.sdc.ds.ws.ResultType; 
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import nl.captcha.Captcha;

/**
 *
 * @author Ricardo Rodríguez
 */
public final class UsuarioBean extends BaseManageBean implements  Serializable{

    private static final long serialVersionUID = 1;
    private String codigoUsuario;
    private String usuario;
    private String clave;
    private String nombre;
    private String descripcionCliente;
    private String descripcionObra;
    private String codigoCliente;
    private String codigoPerfil;
    private String perfil;
    private String selectedUsuario;
    private SelectItem[] lstClienteItems;
    private ArrayList<VistaBean> vistas;
    private ArrayList<ObraBeanViewBean> obras;
    private BufferedImage captchaImage;
    private String guess;
    private String answer;
    private String result;
    private Captcha captcha;

    public UsuarioBean() {
        codigoUsuario = "";
        usuario = "";
        clave = "";
        nombre = "";
        codigoPerfil = "";
        perfil = "";
        lstClienteItems = new SelectItem[0];
        vistas = new ArrayList<VistaBean>(0);
        obras = new ArrayList<ObraBeanViewBean>(0);
        lstClienteItems = new SelectItem[1];
        lstClienteItems[0] = new SelectItem("", "Empresas Asociadas");
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
        guess = "";

    }
    
    /* JMENDOZA | 20140303 | Proy. 817: Se crea metodo que verifica si se ha retornado datos del usuario y cliente en el request */
    /* 20140303-01 | INICIO */
    public void getUsuarioCliente()
    {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if(request!=null)
        {
            String usuario_ = "";
            String selectedUsuario_ = "";
            
            if((request.getAttribute("flag") != null) && (request.getAttribute("login") != null) && (request.getAttribute("usuario") != null))
            {
                usuario_ = request.getAttribute("login").toString() ;
                selectedUsuario_ = request.getAttribute("usuario").toString();
                
                if((!usuario_.isEmpty()) && (!selectedUsuario_.isEmpty()))
                {
                    request.removeAttribute("login");
                    request.removeAttribute("usuario");
                    request.removeAttribute("flag");
                    usuario = usuario_;
                    selectedUsuario = selectedUsuario_;
                    btnBuscarClientesPerformed();
                }
              
            }
        }
    }
    /* 20140303-01 | FIN */

    // <editor-fold defaultstate="collapsed" desc="Getter & Setter">
    /**
     * @return el codigoUsuario
     */
    public String getCodigoUsuario() {
        
        /* JMENDOZA | 20140303 | Proy. 817: Se agrega llamado a la funcion que verifica el request */
        /* 20140303-02 | INICIO */
        getUsuarioCliente();
        /* 20140303-02 | FIN */
        return codigoUsuario;
        
    }

    /**
     * @param codigoUsuario el codigoUsuario para ser asignado
     */
    public void setCodigoUsuario(String codigoUsuario) {
        this.codigoUsuario = codigoUsuario;
    }

    /**
     * @return el usuario
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * @param usuario el usuario para ser asignado
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return el clave
     */
    public String getClave() {
        return clave;
    }

    /**
     * @param clave el clave para ser asignado
     */
    public void setClave(String clave) {
        this.clave = clave;
    }

    /**
     * @return el nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre el nombre para ser asignado
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return el codigoPerfil
     */
    public String getCodigoPerfil() {
        return codigoPerfil;
    }

    /**
     * @param codigoPerfil el codigoPerfil para ser asignado
     */
    public void setCodigoPerfil(String codigoPerfil) {
        this.codigoPerfil = codigoPerfil;
    }

    /**
     * @return el perfil
     */
    public String getPerfil() {
        return perfil;
    }

    /**
     * @param perfil el perfil para ser asignado
     */
    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    /**
     * @return las vistas
     */
    public ArrayList<VistaBean> getVistas() {
        return vistas;
    }

    /**
     * @param vistas las vistas para asignar
     */
    public void setVistas(ArrayList<VistaBean> vistas) {
        this.vistas = vistas;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("usuario : ").append(usuario).append("\r");
        sb.append("codigoPerfil : ").append(codigoPerfil).append("\r");
        return sb.toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final UsuarioBean other = (UsuarioBean) obj;
        if ((this.usuario == null) ? (other.usuario != null) : !this.usuario.equals(other.usuario)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 43 * hash + (this.usuario != null ? this.usuario.hashCode() : 0);
        return hash;
    }

    
    public String btnCambioClaveActionPerformed(){
        
           HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                    if(request!=null)
                    {
                        System.out.println("ENVIO "+this.usuario+"-"+this.getSelectedUsuario() );
                       
                      
                        
                        request.setAttribute("login", this.usuario);
                        request.setAttribute("usuario", this.getSelectedUsuario());
                    }
        
    return "cambioClave";
    
    }
    
        
    public String btnOlvideClaveActionPerformed(){
        
           HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                    if(request!=null)
                    {
                        request.setAttribute("login", this.usuario);
                        request.setAttribute("usuario", this.getSelectedUsuario());
                    }
        
    return "olvideClave";
    
    }
    
    
    
    public String btnIngresarActionPerformed() {

        if (logger.isDebugEnabled()) {
            StringBuffer sb = new StringBuffer("El login ");
            sb.append(usuario).append(" intenta ingresar al sistema.");
            logger.debug(sb.toString());
        }


        SeguridadDAO seguridadDao = new SeguridadDAO();
        ResultType result = seguridadDao.validarUsuario(getSelectedUsuario(), clave);


    
        if (getGuess().equals(getAnswer())) {


            if (result.getResult().equals(Boolean.TRUE)) {


                ResultType resultExpiracion = seguridadDao.validarExpiracionPasswordUsuario(getSelectedUsuario(), "", "");
                if (resultExpiracion.getResult().equals(Boolean.TRUE)) {
                    com.unicon.sdc.ds.ws.UsuarioBean usuarioAutoservicio = seguridadDao.getUsuarioBean(getSelectedUsuario(), clave);
                    this.codigoCliente = usuarioAutoservicio.getCodigoCliente();
                    this.codigoUsuario = getSelectedUsuario();
                    this.codigoPerfil = usuarioAutoservicio.getCodigoPerfil();
                    this.descripcionCliente = usuarioAutoservicio.getDescripcionCliente();
                    this.descripcionObra = usuarioAutoservicio.getDescripcionObra();
                    this.nombre = usuarioAutoservicio.getNombre();
                    this.perfil = usuarioAutoservicio.getPerfil();
                    this.vistas = new ArrayList<VistaBean>();
                    VistaBean vista = null;
                    for (com.unicon.sdc.ds.ws.VistaBean v : usuarioAutoservicio.getVistas()) {
                        vista = new VistaBean(v);
                        vistas.add(vista);
                    }



                    List<ObraBean> obrasWs = seguridadDao.getObrasPorCliente(codigoCliente, codigoUsuario, usuario, clave);

                    if (obrasWs != null && obrasWs.size() > 0) {
                        ObraBeanViewBean obra = null;
                        for (ObraBean ob : obrasWs) {
                            obra = new ObraBeanViewBean(ob);
                            obras.add(obra);
                        }

                    } else {

                        FacesUtils.addErrorMessageFromResource("error.ObrasPorUsuario", null);
                        try {
                            throw new Exception("No existen obras activas para el cliente.");
                        } catch (Exception ex) {
                            logger.error(ex.getMessage(), ex);
                            return null;
                        }

                    }

                } else 
                {   
                    /* JMENDOZA | 20140303 | Proy. 817: Antes de llamar a la pagina de cambio de clave se guarda en el request el usuario y el cliente */
                    /* 20140303-03 | INICIO */
                    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                    if(request!=null)
                    {
                        request.setAttribute("login", this.usuario);
                        request.setAttribute("usuario", this.getSelectedUsuario());
                    }
                    /* 20140303-03 | FIN */
                    
                    return "cambioClave";

                }



            } else {
               
                FacesUtils.addErrorMessageFromResource("error.registroUsuario", null);
                try {
                    throw new Exception("El usuario no esta registrado para usar este sistema: " + getSelectedUsuario());
                } catch (Exception ex) {
                    logger.error(ex.getMessage(), ex);
                    return null;
                }
            }


        } else {
          
            FacesUtils.addErrorMessageFromResource("error.codigoCaptchaIncorrecto", null);
            captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
            captchaImage = captcha.getImage();


            return null;
        }

        return "ingresar";
    }

    public boolean btnBuscarClientesPerformed() {

        if (logger.isDebugEnabled()) {
            StringBuffer sb = new StringBuffer("El login ");
            sb.append(usuario).append(" buscando Cliente.");
            logger.debug(sb.toString());
        }

        SeguridadDAO seguridadDao = new SeguridadDAO();

        List<com.unicon.sdc.ds.ws.UsuarioBean> lista = seguridadDao.getEmpresasUsuario(usuario);

        if (lista != null && lista.size() > 0) {
            lstClienteItems = new SelectItem[lista.size()];

            int i = 0;
            for (com.unicon.sdc.ds.ws.UsuarioBean usuario : lista) {
                lstClienteItems[i] = new SelectItem(usuario.getCodigoUsuario(), usuario.getDescripcionCliente());
                if(i==0){
                selectedUsuario=usuario.getCodigoUsuario();
                }
                i++;
            }
        } else {
            inicializarCampos();
            FacesUtils.addErrorMessageFromResource("error.clientesPorUsuario", null);
            try {
                throw new Exception("No existen usuarios registrados  para  la cuenta que se desea loguear : " + getUsuario());

            } catch (Exception ex) {
                logger.error(ex.getMessage(), ex);
                return true;
            }


        }

        return true;
    }

    /**
     * @return the descripcionCliente
     */
    public String getDescripcionCliente() {
        return descripcionCliente;
    }

    /**
     * @param descripcionCliente the descripcionCliente to set
     */
    public void setDescripcionCliente(String descripcionCliente) {
        this.descripcionCliente = descripcionCliente;
    }

    /**
     * @return the descripcionObra
     */
    public String getDescripcionObra() {
        return descripcionObra;
    }

    /**
     * @param descripcionObra the descripcionObra to set
     */
    public void setDescripcionObra(String descripcionObra) {
        this.descripcionObra = descripcionObra;
    }

    /**
     * @return the codigoCliente
     */
    public String getCodigoCliente() {
        return codigoCliente;
    }

    /**
     * @param codigoCliente the codigoCliente to set
     */
    public void setCodigoCliente(String codigoCliente) {
        this.codigoCliente = codigoCliente;
    }

    /**
     * @return the obras
     */
    public ArrayList<ObraBeanViewBean> getObras() {
        return obras;
    }

    /**
     * @param obras the obras to set
     */
    public void setObras(ArrayList<ObraBeanViewBean> obras) {
        this.obras = obras;
    }

    /**
     * @return the lstClienteItems
     */
    public SelectItem[] getLstClienteItems() {
        return lstClienteItems;
    }

    /**
     * @param lstClienteItems the lstClienteItems to set
     */
    public void setLstClienteItems(SelectItem[] lstClienteItems) {
        this.lstClienteItems = lstClienteItems;
    }

    /**
     * @return the selectedUsuario
     */
    public String getSelectedUsuario() {
        return selectedUsuario;
    }

    /**
     * @param selectedUsuario the selectedUsuario to set
     */
    public void setSelectedUsuario(String selectedUsuario) {
        this.selectedUsuario = selectedUsuario;
    }

    public void refreshCaptcha(ActionEvent event) {
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();

        captchaImage = captcha.getImage();

        setAnswer(captcha.getAnswer());
    }

    public byte[] getCaptchaImage() {
        if (captchaImage == null) {
            refreshCaptcha(null);
        }
        return covertImageToBytes(captchaImage);
    }

    private static byte[] covertImageToBytes(BufferedImage image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", baos);
        } catch (IOException ex) {
        }
        return baos.toByteArray();
    }

    /**
     * @return the guess
     */
    public String getGuess() {
        return guess;
    }

    /**
     * @param guess the guess to set
     */
    public void setGuess(String guess) {
        this.guess = guess;
    }

    /**
     * @return the answer
     */
    public String getAnswer() {
        answer = captcha.getAnswer();
        return answer;
    }

    /**
     * @param answer the answer to set
     */
    public void setAnswer(String answer) {
        this.answer = answer;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }

    /**
     * @param result the result to set
     */
    public void setResult(String result) {
        this.result = result;
    }

    private void inicializarCampos() {
        codigoUsuario = "";
     
        clave = "";
        nombre = "";
        codigoPerfil = "";
        perfil = "";
       
        vistas = new ArrayList<VistaBean>(0);
        obras = new ArrayList<ObraBeanViewBean>(0);
        lstClienteItems = new SelectItem[1];
        lstClienteItems[0] = new SelectItem("", "Empresas Asociadas");
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();

        captchaImage = captcha.getImage();

        setAnswer(captcha.getAnswer());
        guess = "";
    }
    
  public boolean   buscarClienteListener(ValueChangeEvent event){
      
          if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
          return true;  
        }

    
          return  btnBuscarClientesPerformed();  
  }
}
